package edu.pe.cayetano.model.bo;

import java.util.ArrayList;
import java.util.Map;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.dao.PlanTratamientoDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.model.to.PlanTratamientoDetalleTO;
import edu.pe.cayetano.model.to.PlanTratamientoTO;
import edu.pe.cayetano.model.to.ServicioTO;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.UtilTime;
import edu.pe.cayetano.util.UtilTipoDato;
import edu.pe.cayetano.util.Utilitario;
import edu.pe.cayetano.util.UtilitarioSQLQuery;

public class PlanTratramientoBO extends BaseBO{

	
	public StringBuffer estableceQuery(DynaBean dyna){
		StringBuffer 			query 			= new StringBuffer();
		String criterio		= null;
		if(Utilitario.validaAtributoDynaBean(dyna, "criterio"))
			criterio=(String)dyna.get("criterio");
		String campo		= (String)dyna.get("optCampo");
		String operacion	= (String)dyna.get("operacion");
		
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
			}else{
				query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}
		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
		}
		System.out.println("21:"+query.toString());
		return query;
	}

	public StringBuffer estableceQuery(String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
			}else{
				query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
				query.append(" where upper("+campo.toUpperCase()+") like '%"+criterio.toUpperCase()+"%'"); 
			}
		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query=UtilitarioSQLQuery.devuelveListadoPlanTratamiento();
		}
		System.out.println("1:"+query.toString());
		return query;
	}
	
	public BResult listarPlanTratamiento() throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQuery(ConstantesSECCD.OPERACION_LISTADO,"","");
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PlanTratramientoBO] error en metodo listarPlanTratamiento generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PlanTratramientoBO] error en metodo listarPlanTratamiento generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	public BResult buscarPlanTratamiento(DynaBean dyna) throws BusinessException{
		BResult 				retSalida		= null;
		OperacionesComunesDAO	operacionesDAO	= null;
		StringBuffer 			query 			= new StringBuffer(); 
		try{
			query = estableceQuery(dyna);
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 			= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PlanTratramientoBO] error en metodo buscarPlanTratamiento generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PlanTratramientoBO] error en metodo buscarPaciente generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult buscarPlanTratamientoxArchivo(DynaBean dyna) throws BusinessException{
		
		BResult 				ret					= new BResult();
		
		try{
			conectar();
			PlanTratamientoDAO planTratamDAO = new PlanTratamientoDAO(conn);
			ret = planTratamDAO.buscarPlanTratamientoxArchivo(dyna);
		}catch(Exception e){
			ret.setException(e);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return ret;
	}
	
	public BResult buscarPlanTratamientoEspecifico(DynaBean dyna) throws BusinessException{
		
		BResult 				ret					= new BResult();
		
		try{
			conectar();
			PlanTratamientoDAO planTratamDAO = new PlanTratamientoDAO(conn);
			ret = planTratamDAO.buscarPlanTratamientoEspecifico(Utilitario.getPropertyDynaBean(dyna,"codigo"));
		}catch(Exception e){
			ret.setException(e);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return ret;
	}
	
	public BResult buscarDetallePlanTratamiento(String codigo) throws BusinessException{
		
		BResult 				ret					= new BResult();
		
		try{
			conectar();
			PlanTratamientoDAO planTratamDAO = new PlanTratamientoDAO(conn);
			ret = planTratamDAO.buscarDetallePlanTratamientoEspecifico(codigo);
		}catch(Exception e){
			ret.setException(e);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return ret;
	}
	
	public BResult insertaPlanTratamiento(DynaBean dyna,ArrayList lista) throws BusinessException{
		BResult 						retSalida				= null;
		PlanTratamientoDetalleTO		ptdTO					= null;					
		try{
			conectar();
			PlanTratamientoDAO 	planTratamientoDAO	 	= new PlanTratamientoDAO(conn);
			String codigo 	= generaCodigoInsercionPlanTratamiento(planTratamientoDAO.obtieneCantidadRegistrosxYear());
			int		codigoDPT	= planTratamientoDAO.obtieneCantidadRegistrosDPT();
			retSalida 		= planTratamientoDAO.insertaPlanTratamiento(dyna,codigo);
			for(int i=0;i<lista.size();i++){
				codigoDPT++;
				ptdTO	= (PlanTratamientoDetalleTO)lista.get(i);
				ptdTO.setCodigoDetalle(generaCodigoInsercionDetallePlanTratamiento(codigoDPT));
				planTratamientoDAO.insertaDetallePlanTratamiento(ptdTO, codigo);
			}
			grabar();
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PlanTratramientoBO] error en metodo insertaPlanTratamiento generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PlanTratramientoBO] error en metodo insertaPlanTratamiento generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public String generaCodigoInsercionPlanTratamiento(int cantidad){
		String codigo="";
		String temporal = String.valueOf(cantidad+1);
		if(temporal.length()==1)
			codigo="00000"+temporal;
		if(temporal.length()==2)
			codigo="0000"+temporal;
		if(temporal.length()==3)
			codigo="000"+temporal;
		if(temporal.length()==4)
			codigo="00"+temporal;
		if(temporal.length()==5)
			codigo="0"+temporal;
			
		codigo="PT"+ UtilTime.devuelveAnioActual().toString()+codigo;
		return codigo;
	}

	public String generaCodigoInsercionDetallePlanTratamiento(int cantidad){
		String codigo="";
		String temporal = String.valueOf(cantidad);
		if(temporal.length()==1)
			codigo="000000"+temporal;
		if(temporal.length()==2)
			codigo="00000"+temporal;
		if(temporal.length()==3)
			codigo="0000"+temporal;
		if(temporal.length()==4)
			codigo="000"+temporal;
		if(temporal.length()==5)
			codigo="00"+temporal;
		if(temporal.length()==6)
			codigo="0"+temporal;			
		codigo="DPT"+codigo;
		return codigo;
	}
	
	public Map  generaDetalleServicioxPT(Map hashtable, String concatenado[],String fases[],String servicios[],String cantidades[],
			String nomFases[],String nomEspecialidades[],String nomServicios[]){
		PlanTratamientoDetalleTO ptdTO = null;
		try {
			for(int i=0;i<=concatenado.length;i++){
				ptdTO = new PlanTratamientoDetalleTO();
				ptdTO.setConcatenadoServicioxFase(concatenado[i]);
				ptdTO.setCodigoFase(UtilTipoDato.convierteCadenaToInt(fases[i]));
				ptdTO.setCodigoServicio(UtilTipoDato.convierteCadenaToInt(servicios[i]));
				
				ptdTO.setNombreFase(nomFases[i]);
				ptdTO.setNombreEspecialidad(nomEspecialidades[i]);
				ptdTO.setNombreServicio(nomServicios[i]);
				System.out.println("i:"+i+"<"+cantidades[i]+">");
				ptdTO.setCantidad(UtilTipoDato.convierteCadenaToInt(cantidades[i]));
				hashtable.put(ptdTO.getConcatenadoServicioxFase(), ptdTO);
			} 
		}catch (Exception e) {
				System.out.println("error generador por: " +e.getMessage());
		}
		return hashtable; 
	}
	
	public BResult editaPlanTratamiento(DynaBean dyna,ArrayList lista) throws BusinessException{
		BResult 						retSalida 				= new BResult();
		BResult 						retElimina				= null;
		PlanTratamientoDetalleTO		ptdTO					= null;					
		try{
			conectar();
			PlanTratamientoDAO 	planTratamientoDAO	 	= new PlanTratamientoDAO(conn);
			String codigo  = Utilitario.getPropertyDynaBean(dyna,"codigo");
			System.out.println("codigo:::<"+codigo+">");
			retElimina = planTratamientoDAO.eliminaDetallePlanTratamiento(codigo);
			
			if(retElimina.getCode()==0){
				int		codigoDPT	= planTratamientoDAO.obtieneCantidadRegistrosDPT();
				for(int i=0;i<lista.size();i++){
					codigoDPT++;
					ptdTO	= (PlanTratamientoDetalleTO)lista.get(i);
					ptdTO.setCodigoDetalle(generaCodigoInsercionDetallePlanTratamiento(codigoDPT));
					planTratamientoDAO.insertaDetallePlanTratamiento(ptdTO, codigo);
				}
				retSalida.setCode(ConstantesSECCD.EXITO_RET);
				grabar();
			}else{
				deshacer();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PlanTratramientoBO] error en metodo editaPlanTratamiento generado por xxxxx:");
			}
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[PlanTratramientoBO] error en metodo editaPlanTratamiento generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[PlanTratramientoBO] error en metodo insertaPlanTratamiento generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult buscarDatosCabeceraPlanTratamiento(DynaBean dyna) throws BusinessException{
		
		BResult 								retSalida				= new BResult();
		PlanTratamientoTO						planTratamTO			= new PlanTratamientoTO(); 
		ArrayList<ServicioTO> 				listadoServicios	 	= new ArrayList<ServicioTO>();
		ArrayList 								listadoSalida	 		= new ArrayList();
		String									codigo 					= null;
		try{
			conectar();
			codigo = (String)dyna.get("txtPlanTratam");
			PlanTratamientoDAO planTratamientoDAO = new PlanTratamientoDAO(conn);
			planTratamTO = planTratamientoDAO.buscaPacientexPlanTratamiento(codigo);
			listadoServicios = planTratamientoDAO.getServicioxDetallePlanTratamiento(codigo);
			
			listadoSalida.add(planTratamTO);
			
			listadoSalida.add(listadoServicios);
			
			retSalida.setObject(listadoSalida);
			retSalida.setCode(ConstantesSECCD.EXITO_RET);
		}catch(Exception e){
			retSalida.setException(e);
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return retSalida;
	}
	
	public ArrayList getServicioxDetallePlanTratamiento(String codigo) throws BusinessException{
		
		BResult 								ret					= new BResult();
		ArrayList<ServicioTO> 				listadoServicios	 	= new ArrayList<ServicioTO>();
		try{
			conectar();
			PlanTratamientoDAO planTratamDAO = new PlanTratamientoDAO(conn);
			listadoServicios = planTratamDAO.getServicioxDetallePlanTratamiento(codigo);
		}catch(Exception e){
			ret.setException(e);
		}finally{
			try{
				desconectar();
			}catch(Exception e){
			}
		}
		return listadoServicios;
	}
}
